﻿namespace PropOnline.Stores
{
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using PropOnline.Helpers;
    using PropOnline.Models;
    using PropOnline.Stores.Data;
    using PropOnline.ViewModels.Shared;

    public class BusquedaStore
    {        
        private static IEnumerable<Zona> zonas;        

        private static IEnumerable<BarrioOption> barrios;

        public IEnumerable<Zona> Zonas
        {
            get
            {
                if (zonas == null)
                {
                    zonas =
                        Database
                            .Query("Select * From zona")
                            .Results(r =>
                                new Zona
                                {
                                    Id = r.Id,
                                    Nombre = r.Nombre
                                });
                }

                return zonas;
            }
        }

        public IEnumerable<BarrioOption> Barrios
        {
            get
            {
                if (barrios == null)
                {
                    var barrioOptions =
                        Database
                            .Query("Select * From barrio")
                            .Results(r =>
                                new BarrioOption
                                {
                                    Id = r.Id,
                                    Nombre = r.Nombre,
                                    IsChecked = false,
                                    BarrioPadreId = r.BarrioPadreId
                                })
                            .OrderBy(b => b.Nombre).ToList();

                    // lleno los hijos                    
                    barrioOptions.ForEach(b => { b.Hijos = barrioOptions.Where(bh => bh.BarrioPadreId == b.Id).ToList(); });
                    
                    // dejo solo los padres
                    barrioOptions.RemoveAll(b => b.BarrioPadreId != null);

                    barrios = barrioOptions;
                }

                // devuelvo una copia
                return barrios.Select(barrio => new BarrioOption 
                        {
                            Id = barrio.Id,
                            Nombre = barrio.Nombre,
                            IsChecked = false,
                            Hijos = barrio.Hijos.Select(hijo => new BarrioOption 
                                    {
                                        Id = hijo.Id,
                                        Nombre = hijo.Nombre,
                                        IsChecked = false,
                                        }).ToList()
                        });
            }
        }

        public IEnumerable<Calle> ObtenerCalles(string term)
        {
            var likeTerm = string.Format("%{0}%", term);
            return
                Database
                .StoredProcedure("calle_por_nombre")
                .WithParameter("LikeNombre", likeTerm)
                .Results(r =>
                    new Calle
                    {
                        Id = r.Id,
                        Nombre = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(r.Nombre.ToLower())
                    });
        }
    }
}
